package com.foreknow.controller;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

/**
 *  什么是servlet :servlet就是服务器端的应用程序
 *  作用:
 *  1.可以读取客户端发送的所有数据
 *  2.可以插叙HTTP请求中包含的任何其他信息(获取请求参数)
 *  3.可以去处理数据并生成结果
 *  4.可以设置合适的HTTP响应的参数
 *  5.将响应的信息发送给客户端
 *
 *  1.要想创建一个Servlet,那么一定要继承HTTPServlet
 *  2.重写doGet/doPost方法
 *      这两个方法什么时候调用:如果客户端向服务器端发送的请求是get请求,那么就会自动去调用Servlet中的doGet()方法
 *                           如果客户端向服务器端发送的请求是Post请求,那么就会自动去调用Servlet中的doPost()方法 表单
 *  3.方法的参数:
 *      关于请求的方法
 *          http1.1支持多种请求方式:常用的方式 ,get(查询) post(添加) put(修改)  delete(删除)
 *      HttpServletRequest   req  接口:这个接口无需我们自己初始化,服务器(web容器)会自动将它进行初始化
 *          这个接口中会提供一些方法:例如 获取一些请求的参数
 *      HttpServletRequest接口的作用:
 *          1.可以提取客户端请求的信息
 *              提取客户端表单的信息   提取http的头信息   提取cookie的信息
 *          2.修改字符的编码
 *          3.在服务器端来保存数据
 *          4.进行资源的跳转
 *
 *
 *      HttpServletResponse   rep   接口:这个接口无需我们自己初始化,服务器(web容器)会自动将它进行初始化
 *
 *      以上的参数大家可以从网络上下载JavaEE6的开发文档:Java.Servlet.http
 *
 * Servlet的生命周期:就是一个对象从它被创建开始一直到这个对象被销毁掉.
 * 三个阶段:
 * 1.初始化阶段  init()
 * 2.响应客户端请求的阶段  service()
 * 3.销毁阶段 destroy()
 *
 * jsp中的页面指令: page include taglib
 *
 * jsp中的动作标签<jsp:userbean></jsp:userbean>
 *
 * jsp 隐含对象
 * request
 * session
 * response
 * out
 * application
 * config
 *pagecontent
 *
 * 如果简化JSP页面:JSTL 标签库 EL表达式 来简化JSP页面
 * EL:它是JSP中一种简洁的数据访问语言,简化jsp的开发
 * 基本的语法: ${表达式}
 * 1.可以使用EL表达式来访问作用域中(request)的对象 ${对象名}
 * 2.可以使用EL表达式来访问javabean对象中的属性 ${对象名.属性吗}
 *          req.setAttribute("admin",admin);   username:${admin.username}
 * 3.可以使用EL表达式来访问数组  ${数组对象名[下标索引]}
 *      <%
 *              String[] array={"aaa","bbb","ccc"};
 *              request.setAttribute("array",array)
 *      %>
 *      ${array[0]}]
 *
 * 4.可以通过EL表达式中提供的一些隐式对象(requestScope)来访问指定作用域中的对象  ${requestScope.对象名}
 *
 * 在web应用中如何处理乱码的问题
 * 1.需要在servlet中设置请求和响应的编码方式
 * 2.在jsp的头部声明,统一输出字符集编码
 * 3.设置数据库的字符集
 *      String name = rs.getString("NAME")
 *      String username= new String(name.getBytes("ISO-8859-1"),"utf-8");
 * 4.如果有需要还可以设置服务器的字符集 conf/server.xml文件
 *      <Connector port ="8080" URIEncoding ="utf-8"></Connector>
 *
 *
 *   web中的四个作用域:
 *   application>session>request>page
 *   application:只要服务器不关闭,保存在application 中的数据会一直有效
 *   session:只要浏览器不关闭,数据会一直有效
 */




public class FirstServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//      设置服务器端向客户端响应的内容的类型(MIME)
        resp.setContentType("text/html;charset=utf-8");
//      要使用这个对象的方法在页面输出内容
        PrintWriter out  =resp.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>这是一个servlet程序</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>这是一个测试程序servlet</h1>");
        out.println(new Date()+"<br>");
        //getMethod()方法可以获取客户端向服务器端请求的方法
        out.println("获取客户端向服务器端请求的方法:"+req.getMethod()+"<br>");
        out.println("获取请求的url:"+req.getRequestURL()+"<br>");
        out.println("获取请求的uri:"+req.getRequestURI()+"<br>");
        out.println("获取当前项目的名称:"+req.getContextPath()+"<br>");
        out.println("获取本地端口号:"+req.getLocalPort()+"<br>");
        out.println("获取http协议名称:"+req.getProtocol()+"<br>");
        out.println("</body>");
        out.println("</html>");
        out.flush();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }

    @Override
    public void init(ServletConfig config) throws ServletException {
////        servletConfig:使用此对象中的方法可以获取web.xml中配置的初始化参数
//        String  pageSize =  config.getInitParameter("pageSize");
//        如何获取全局的初始化参数,一定要先调用 getServletContext方法
        String pageSize = config.getServletContext().getInitParameter("pageSize");
        System.out.println(Integer.parseInt(pageSize));
    }

    @Override
    public void destroy() {
        System.out.println("这是servlet生命周期的销毁阶段");
    }

//    @Override
//    public void init() throws ServletException {
//        //只被调用一次init()方法
//        System.out.println("这是servlet生命周期中的初始化阶段");
//    }
}
























